iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 14
0

(本篇文章網誌版:http://shineright.blogspot.tw/2016/12/day-14-animator.html

Day 9曾提到,有些裝備(死亡之帽、綠帽、皮卡耳、雷達)會有發射時特別的樣子。

http://ithelp.ithome.com.tw/upload/images/20161214/20103149VwmzBF1q4g.png

要更變射擊時的樣子(也就是改變sprite)有許多方式,因為懶得多寫程式碼,所以我將使用Unity方便的Animator系統。

點擊製作發射狀態的Game Object,進入Animation視窗,按Create。這個步驟先前已經做過許多次,但先前沒說過在建立Animation那一刻,Unity會自動為該sprite建立一個用來控制Animation的Animator。

點選上方Window選單,把Animator視窗打開,可以看到Unity已經建立好一個動畫流程圖了。

http://ithelp.ithome.com.tw/upload/images/20161214/201031497gXu1Qu5Qu.png

在Animator任一處按右鍵,選Create State→Empty建立一個動畫狀態,命名為「Shoot State」,並把一開始自動產生的動畫狀態命名為「Normal State」。接著,在Normal State上點擊右鍵→Make Transition,把鍵頭拉向Shoot State。也在Shoot State上點擊右鍵→Make Transition,把箭頭拉向Normal State。

http://ithelp.ithome.com.tw/upload/images/20161214/20103149YEtUgg0ytE.png

進行下一步之前,先來簡單講解一下Animator的運作方式。Animator可以建立Transition(也就是剛剛建立的箭頭),控制一個動畫狀態(片段)是否可以轉往另一個狀態。例如,Normal State有箭頭指向Shoot State,所以Normal State可以轉換到Shoot State。同理,Shoot State有箭頭指向Normal State,所以Shoot State也可以轉換到Normal State。

但究竟要如何轉換呢?常用的轉換方式大致分為兩種:一、在動畫片段結束後(或過一段時間後)自動轉換。二、建立Animator的參數,並以Script控制轉換的時機。

上述兩種轉換方式我都會用到。從Normal State到Shoot State,我會從SpawnBullet.cs中控制,從Shoot State到Normal State,我會讓動畫結束後自動轉換。

先來製作比較簡單的自動轉換……事實上,完全不用做任何事情。點擊Shoot State到Normal State的箭頭,在Inspector中,可以看到Has Exit Time被勾選了。這就代表這個Transition會在時間結束後自動進行。

http://ithelp.ithome.com.tw/upload/images/20161214/20103149eLvFeFQtGs.png

接著來看如何用Script控制Animator。點擊Animator左上方的Parameters鈕,並點Parameters欄右上方的+號,選擇Trigger,命名為「Shoot」。

http://ithelp.ithome.com.tw/upload/images/20161214/20103149YrHOGWYsra.png

接著點擊Normal State到Shoot State的箭頭,在Inspector中把「Has Exit Time」取消,並在下方的Conditions欄中按+,因為這個Animator只有一個Parameter,所以Unity會自動選擇剛剛建立的Shoot。這表示,當Animator在Normal State時,在Script中觸發「Shoot」,Animator就會轉換到「Shoot State」。

打開先前寫好的「SpawnBullet.cs」,新宣告一個變數:

public Animator shootAnim = null;

並在SpawnCoroutine()while (true)中,

GameObject bullet = (Instantiate (bulletPrefab, new Vector3 (transform.position.x, transform.position.y, 0.1f), Quaternion.identity) as GameObject);

的下方加入

if (shootAnim != null)
    shootAnim.SetTrigger ("Shoot");

就完成了。

Animator型態的shootAnim是用來儲存擁有Animator Component的Game Object (Unity會自動為有Animation的Game Object建立Animator Component)。

Instantiate子彈下方,因為有些裝備不需改變射擊狀態,所以必須先判斷shootAnim是否為null,如果不是,就呼叫SetTrigger()並傳入”Shoot”,以觸發剛剛在Animator建立的「Shoot」 Parameter。

寫完短短幾行程式碼,回到Animation視窗,在左上角Create New Clip新建動畫片段。

http://ithelp.ithome.com.tw/upload/images/20161214/20103149MwVucpmWXI.png

把兩個動畫片段的時間軸都拉上sprite (Shoot片段記得把sprite拉到想要的持續時間)。

http://ithelp.ithome.com.tw/upload/images/20161214/20103149DCykgd2ezI.png

並在兩個動畫片段的Inspector欄中把「Loop Time」取消,畢竟這個動畫片段不需重複播放。

回到Animator視窗,Unity自動新增了一個剛剛建立的動畫狀態。把它刪了,並點擊Shoot State,把Motion欄設為剛剛建立的動畫。

最後,在裝備的Inspector欄把Animator設定好就大功告成了。

進入Play Mode測試,裝備現在會隨著子彈的發射而改變sprite了。

繪圖進度

完成開始畫面……其實只是把人物疊一疊,加一些字就好了。

http://ithelp.ithome.com.tw/upload/images/20161214/20103149KqaMsxBODU.png

待續。


上一篇
Day 13: 少林功夫好
下一篇
Day 15: 敵人現身
系列文
我要和天一樣高!!!(Unity 2D手機小遊戲開發日誌)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言